package com.xcap.security.datasourceauthentication.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Component
@Slf4j
public class JwtUtil {

    @Value("${jwt.secretKey}")
    private String jwtSecretKey;

    /**
     * 生成 token
     * @param userInfo
     * @param authList
     * @return
     */
    public String createToken(String userInfo, List<String> authList){

        Date currentDate = new Date();
        Date expireTime = new Date(currentDate.getTime() + 1000 * 60 * 5);//5分钟后过期
        HashMap<String, Object> headerClaims = new HashMap<>();
        headerClaims.put("alg", "HS256");
        headerClaims.put("typ", "JWT");
        // 创建签名 jwt
        return JWT.create().withHeader(headerClaims) //头部   下面是负载
                .withIssuedAt(currentDate) //已经注册声明，签发时间
                .withExpiresAt(expireTime) //已注册声明，过期时间
                .withIssuer("tom")  //已注册声明 签发人
                .withClaim("userInfo", userInfo)//私有声明可以自己定义
                .withClaim("authList", authList)//私有生命可以自己定义
                .sign(Algorithm.HMAC256(jwtSecretKey));
    }

    /**
     * 验证jwt的签名，简称 验签
     * @param token
     * @return
     */
    public boolean verifyToken(String token){
        //获取验签类对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(jwtSecretKey)).build();
        try {
            //验签 如果不报错，说明jwt是合法的，且没有过期
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            return true;
        }catch (Exception e){
            //报错 说明jwt是非法的 或者已经过期 （过期也属于非法的）
            log.error("验签失败：{}", token);
            e.printStackTrace();

        }
        return false;

    }

    /**
     * 获取用户的id
     * @param token
     * @return
     */
    public String getUserInfo(String token){
        //获取jwt验签对象
        JWTVerifier build = JWT.require(Algorithm.HMAC256(jwtSecretKey)).build();
        try {
            //验签
            DecodedJWT decodedJWT = build.verify(token);
            return decodedJWT.getClaim("userInfo").asString();
        }catch (JWTVerificationException e){
            e.printStackTrace();

        }
        return null;
    }

    /**
     * 获取用户权限
     * @param token
     * @return
     */
    public List<String> getAuthList(String token){
        //创建jwt验签对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(jwtSecretKey)).build();
        try {
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            return decodedJWT.getClaim("authList").asList(String.class);
        }catch (JWTVerificationException e){
            e.printStackTrace();
        }
        return null;

    }


}
